class CancelPromise2 {
    /**
     * 
     * @param {Function} excutor 自己仿照Promise传入的函数 (reslove,reject)=>{} 
     * @param {Object} signal AbortConstroller中的signal对象,使用它可以监听abort调用的时候,添加对应的逻辑
     */
    constructor(excutor, signal = null) {
        console.log(excutor)

        // 用于存储一个改写的resolce
        let _resolve = null;
        //声明一个_reject变量,存储promise的reject方法
        let _reject = null;
        //用于判断promise的状态是否兑现
        let isFulfilled = false;

        let promise = new Promise((resolve, reject) => {

            _resolve = (value) => {
                // console.log(value)
                isFulfilled = true;//promise状态已经兑现了

                resolve(value)
            }
            //将reject函数赋值给_reject
            _reject = reject

            excutor(_resolve, reject)
        })
        //判断是否传递了signal
        if (signal) {
            //侦听 AbortConstroller是否调用了abort()这个方法
            signal.addEventListener('abort', () => {
                //如果isFilled是true 表示promise已经兑现了,没有必要中断了
                if (isFulfilled) {
                    return
                }
                //侦听到了,说明要取消promise
                _reject('cancelPromise2:' + CancelPromise2.cancelMsg)
                new DOMException(CancelPromise2.cancelMsg, 'cancelPromise2')
            })
        }

        return promise
    }
    //静态属性需要通过类直接调用
    static cancelMsg = 'promise状态被取消了'
}

export default CancelPromise2